package Biblioteca

import Contas.Administrador 
import Contas.Usuario 
import Biblioteca.Livro
import org.springframework.security.ui.webapp.AuthenticationProcessingFilter 

class ExemplarController {

    static exemplarResult
	static consulta

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
	def livrosCadastrados = Livro.executeQuery("select titulo, isbn from Livro")
	def fornecedores = Exemplar.executeQuery("select distinct fornecedor from Exemplar")
	
    def index = {
        redirect(action: "list", params: params)
    }
	
	private String getTipoUsuario (){
		def username = session[AuthenticationProcessingFilter.SPRING_SECURITY_LAST_USERNAME_KEY]
		Usuario user = Contas.Usuario.findByUsername(username)
		def tipo
		if (Administrador.get(user.id)==null){
			tipo = "Usuario"
		}else{
			tipo = "Admin"
		}
	return tipo
	}

    def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [exemplarInstanceList: Exemplar.list(params), exemplarInstanceTotal: Exemplar.count(), tipo:this.getTipoUsuario ()]
    }

    def create = {	
        def exemplarInstance = new Exemplar()
        exemplarInstance.properties = params
        return [exemplarInstance: exemplarInstance, livrosCadastrados:livrosCadastrados, fornecedores:fornecedores, tipo:this.getTipoUsuario ()]
    }

    def search = {}

    def search_advanced ={}

	def results ={
		if (!params.max) params.max = 50
		if (!params.offset) params.offset = 0
		if (!params.sort) params.sort = "livro"
		if (!params.order) params.order = "asc"
		
		consulta = params
		println(consulta)

		def criteria = Exemplar.createCriteria()

		exemplarResult = criteria {
			maxResults(params.max?.toInteger())
			firstResult(params.offset?.toInteger())
			order(params.sort, params.order)
			and{ like('livro','%' + params.livro + '%') }
		}

		[pesquisaExemplar: exemplarResult,params : params, tipo:this.getTipoUsuario ()]
	}

    def results_exemplar ={
		if (!params.max) params.max = 50
		if (!params.offset) params.offset = 0
		if (!params.sort) params.sort = "livro"
		if (!params.order) params.order = "asc"

		def criteria = Exemplar.createCriteria()
		
		consulta = params
		println(consulta)
		
		String dataDeAquisicao = ""
		
		java.text.DateFormat df = new java.text.SimpleDateFormat("dd/MM/yyyy");
		
		if(params.dataDeAquisicao){
			dataDeAquisicao = df.format(consulta.dataDeAquisicao)
		}

		exemplarResult = criteria {
			maxResults(params.max?.toInteger())
			firstResult(params.offset?.toInteger())
			order(params.sort, params.order)
			and{
                        like('livro','%' + params.livro + '%')
						
						if(params.fornecedor){
							like('fornecedor','%' + params.fornecedor + '%')
						}                                                
						
						if(dataDeAquisicao != "01/01/1910"){
							between('dataDeAquisicao', new Date(params.dataDeAquisicao.getTime()-((1000*24*60*60)*1)), new Date(params.dataDeAquisicao.getTime()+((1000*24*60*60)*1)))
						}
						                        
            }
		}

		[pesquisaExemplar: exemplarResult,params : params, tipo:this.getTipoUsuario ()]
	}


    def save = {
        def exemplarInstance = new Exemplar(params)
		exemplarInstance.isbnItem = exemplarInstance.getIsbn(params.livro)
		exemplarInstance.livro = (Livro.executeQuery('select titulo from Livro where isbn = ' + "'" + exemplarInstance.isbnItem +"'" ).toString()).replace('[','').replace(']','')
		if (params.fornecedor[0].toString().equals("Novo Fornecedor")){
			exemplarInstance.fornecedor = params.fornecedor[1].toString()
			params.fornecedor = params.fornecedor[1]
			exemplarInstance.fornecedor = params.fornecedor
			if (exemplarInstance.fornecedor.equals ('')){
				livroInstance.fornecedor = null
				params.fornecedor = ''
			}
		}else {
			exemplarInstance.fornecedor = params.fornecedor[0].toString()
		}
        if (exemplarInstance.save(flush: true)) {
            flash.message = "${message(code: 'default.created.message', args: [message(code: 'exemplar.label', default: 'Exemplar'), exemplarInstance.id])}"
            redirect(action: "show", id: exemplarInstance.id)
        }
        else {
            render(view: "create", model: [exemplarInstance: exemplarInstance, livrosCadastrados:livrosCadastrados, fornecedores:fornecedores, tipo:this.getTipoUsuario ()])
        }
    }

    def show = {
        def exemplarInstance = Exemplar.get(params.id)
        if (!exemplarInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'exemplar.label', default: 'Exemplar'), params.id])}"
            redirect(action: "list")
        }
        else {
            [exemplarInstance: exemplarInstance, tipo:this.getTipoUsuario ()]
        }
    }

    def edit = {
        def exemplarInstance = Exemplar.get(params.id)
        if (!exemplarInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'exemplar.label', default: 'Exemplar'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [exemplarInstance: exemplarInstance, fornecedores:fornecedores, tipo:this.getTipoUsuario ()]
        }
    }

    def update = {
        def exemplarInstance = Exemplar.get(params.id)
        if (exemplarInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (exemplarInstance.version > version) {
                    
                    exemplarInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'exemplar.label', default: 'Exemplar')] as Object[], "Another user has updated this Exemplar while you were editing")
                    render(view: "edit", model: [exemplarInstance: exemplarInstance, tipo:this.getTipoUsuario ()])
                    return
                }
            }
            exemplarInstance.properties = params
			if (params.fornecedor[0].toString().equals("Novo Fornecedor")){
				exemplarInstance.fornecedor = params.fornecedor[1].toString()
			}else {
				exemplarInstance.fornecedor = params.tipo[0].toString()
			}
            if (!exemplarInstance.hasErrors() && exemplarInstance.save(flush: true)) {
                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'exemplar.label', default: 'Exemplar'), exemplarInstance.id])}"
                redirect(action: "show", id: exemplarInstance.id)
            }
            else {
                render(view: "edit", model: [exemplarInstance: exemplarInstance, fornecedores:fornecedores, tipo:this.getTipoUsuario ()])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'exemplar.label', default: 'Exemplar'), params.id])}"
            redirect(action: "list")
        }
    }

    def delete = {
        def exemplarInstance = Exemplar.get(params.id)
        if (exemplarInstance) {
            try {
                exemplarInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'exemplar.label', default: 'Exemplar'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'exemplar.label', default: 'Exemplar'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'exemplar.label', default: 'Exemplar'), params.id])}"
            redirect(action: "list")
        }
    }

     def createReportExemplarSimple = {
        def exemplares = exemplarResult
		
		String caminhoLogoSPL = System.getProperty("user.dir") + "\\web-app\\reports\\logo_spl_report.jpg";
		String caminhoLogoGMF = System.getProperty("user.dir") + "\\web-app\\reports\\gmf.jpg";
				
		params.put("logoSPL", caminhoLogoSPL);
		params.put("logoGMF", caminhoLogoGMF);
		params.put("livroConsulta", consulta.livro);
		
        chain(controller:'jasper',action:'index',model:[data:exemplares],params:params)
    }
	 
	 def createReportExemplarComplete = {
		 def exemplares = exemplarResult
		 
		 String caminhoLogoSPL = System.getProperty("user.dir") + "\\web-app\\reports\\logo_spl_report.jpg";
		 String caminhoLogoGMF = System.getProperty("user.dir") + "\\web-app\\reports\\gmf.jpg";
				 
		 params.put("logoSPL", caminhoLogoSPL);
		 params.put("logoGMF", caminhoLogoGMF);
		 params.put("livroConsulta", consulta.livro);
		 params.put("fornecedorConsulta", consulta.fornecedor);
		 
		 String dataDeAquisicao = " "
		 
		 java.text.DateFormat df = new java.text.SimpleDateFormat("dd/MM/yyyy");
		 
		 if(consulta.dataDeAquisicao){
			 dataDeAquisicao = df.format(consulta.dataDeAquisicao)
		 }
		 
		 if(dataDeAquisicao == "01/01/1910"){
			 dataDeAquisicao = " "
		 }
 
		 params.put("dataDeAquisicaoConsulta",dataDeAquisicao);
		 
		 chain(controller:'jasper',action:'index',model:[data:exemplares],params:params)
	 }
}
